<html>
    <head>
        <title>AutoMapper集成</title>
    </head>
    <body>
        <script>
             /*
                        二、AutoMapper集成

                                AutoMapper是最流行的对象到对象映射库之一。
                                
                                "Volo. Abp.AutoMapper"  包定义了IObjectMapper的AutoMapper集成。
                                
                                定义如下所述的映射后，你可以像前面解释的那样使用IObjectMapper接口。

                                1、定义映射 (映射文档)

                                       定义对象映射的一种方法是创建一个 Profile类。 例子：

                                            public class MyProfile : Profile
                                            {
                                                public MyProfile()
                                                {
                                                    CreateMap<User, UserDto>();
                                                }
                                            }

                                2、使用 AbpAutoMapperOptions注册配置文件：

                                        [DependsOn(typeof(AbpAutoMapperModule))]
                                        public class MyModule : AbpModule
                                        {
                                            public override void ConfigureServices(ServiceConfigurationContext context)
                                            {
                                                Configure<AbpAutoMapperOptions>(options =>
                                                {
                                                    //  AddMaps 方法注册在给定类所在程序集中所有的映射文档类。
                                                    options.AddMaps<MyModule>();
                                                });
                                            }
                                        }

                                3、配置验证
                                        
                                        AddMaps可选地采用bool参数来控制模块的配置验证：

                                                options.AddMaps<MyModule>(validate: true);

                                        虽然此选项默认为 false ,但建议启用配置验证作为最佳实践。



                                        可以使用AddProfile而不是AddMaps来控制每个映射文档类的配置验证：

                                                options.AddProfile<MyProfile>(validate: true);

                                        ★、如果你有多个映射文档类，并且只需要为其中的几个启用验证，请先使用 AddMaps 而不进行验证，然后对要验证的的每个映射文档类使用AddProfile.


                                4、对象扩展的映射

                                        对象扩展系统允许为现有类定义额外的属性。ABP提供了一个映射定义扩展来正确映射两个对象爱过你的额外属性。

                                                public class MyProfile : Profile
                                                {
                                                    public MyProfile()
                                                    {
                                                        CreateMap<User, UserDto>()
                                                            .MapExtraProperties();
                                                    }
                                                }

                                        如果两个类都是可扩展对象，建议使用MapExtraProperties()方法（实现IHasExtraProperties接口）。有关更多信息，请参阅对象扩展文档。


                                5、其他有用的扩展方法

                                        还有一些扩展方法可以假话你的映射代码：

                                        ①、忽略审计属性：  

                                                   当你将一个对象映射到另一个对象时，通常会忽略审核属性。

                                                   假设你需要将ProductDto（DTO）映射到Productentity并且该实体继承自AuditedEntity类（它提供了CreationTime、CreatorId、IHasModificationTime…等属性）。

                                                   在从DTO映射时，你可能希望忽略这些基本属性。
                                                   
                                                   你可以使用IgnoreAuditedObjectProperties()方法忽略所有审计属性（而不是一个接一个地手动忽略它们）：

                                                            public class MyProfile : Profile
                                                            {
                                                                public MyProfile()
                                                                {
                                                                    CreateMap<ProductDto, Product>()
                                                                        .IgnoreAuditedObjectProperties(); // 忽略所有审计属性

                                                                }
                                                            }


                                                    还有更多的扩展方法，如IgnoreFullAuditedObjectProperties()和IgnoreCreationAuditedObjectProperties()，它们可以根据你的实体类型使用。

                                                    请参阅实体文档中的“审核属性的基类和接口”部分以了解有关审核属性的更多信息。


                                        ②、忽略其他属性

                                                    在AutoMapper中，你通常编写这样的映射代码来忽略属性：

                                                            public class MyProfile : Profile
                                                            {
                                                                public MyProfile()
                                                                {
                                                                    CreateMap<SimpleClass1, SimpleClass2>()
                                                                        .ForMember(x => x.CreationTime, map => map.Ignore());
                                                                }
                                                            }

                                                    这样代码太长了，在abp中，你可以直接使用 Ignore()扩展方法：

                                                            public class MyProfile : Profile
                                                            {
                                                                public MyProfile()
                                                                {
                                                                    CreateMap<SimpleClass1, SimpleClass2>()
                                                                        .Ignore(x => x.CreationTime);
                                                                }
                                                            }
                    */

        </script>
    </body>
</html>